﻿/********************************************************************************
** @ Date:2024/01/29
** @ Author: Gaojia
** @ Description: 任务执行记录信息类
** @ Version:1.0.0
** @ Fun:
********************************************************************************/
#ifndef CTaskExecInfo_H
#define CTaskExecInfo_H
#include "CPolItemSensor.h"
#include "CPolItemCamer.h"
#include "CTaskInfo.h"
#include "CItemResultCamera.h"
#include "CItemResultSensor.h"
/**
* @ Author: Gaojia
* @ Description: 巡检项 巡检项数据 和巡检点结构体
*/
struct SCPolItemCom
{    
	CPolItem *m_pPolItem;                      //巡检项
	CPolPoint *m_pPolPoint;                    //巡检点
	CItemResultBase *m_ItemResult;             //巡检项结果
	QVector<CItemResultBase *> m_vecItemResult; //持续任务巡检项结果
	//QMap<int, CItemResultCamera*> m_MapCotRollerVoiceResult;//连续检测托辊声音结果,一个托辊只对应一个结果 wxy++ 托辊号-检测结果 暂时用不到
	//QMap<int, CItemResultCamera*> m_MapCotRollerIRResult;//连续检测托辊红外结果,一个托辊只对应一个结果 wxy++    托辊号-检测结果 暂时用不到
	bool m_bIsAction;//是否已执行
	bool m_bIsSave;//是否已经保存到数据库
	bool m_bIsShow;//是否已经在界面上显示
	SCPolItemCom()
	{
		m_pPolItem = nullptr;
		m_pPolPoint = nullptr;
		m_ItemResult = nullptr;
		m_bIsShow = false;
		m_bIsAction = false;
		m_bIsSave = false;
		m_bIsShow = false;
	}
	~SCPolItemCom()
	{
		//释放连续检测内存 wxy++
		for (CItemResultBase* pData : m_vecItemResult) {
			delete pData;
			pData = nullptr;
		}
		m_vecItemResult.clear();

		if (m_pPolItem)
		{
			delete m_pPolItem;
			m_pPolItem = nullptr;
		}

		if (m_pPolPoint)
		{
			delete m_pPolPoint;
			m_pPolPoint = nullptr;
		}

		if (m_ItemResult)
		{
			delete m_ItemResult;
			m_ItemResult = nullptr;
		}
	}
};


class CTaskExecInfo
{
public:
	CTaskExecInfo();
	~CTaskExecInfo();
	void copyData(CTaskExecInfo* pTaskExecInfo);                             //复制这个类
	void deepCopyData(CTaskExecInfo* pTaskExecInfo);//深拷贝数据(使用深拷贝数据用完了记得释放里面New的指针)
	void deleteDeepCopyData();//释放深拷贝数据
	void createTaskInfo(CPolArea *pPolArea,CTaskInfo cTaskInfo, CTemplateInfo cTemplateInfo,int nStartPower, int nSmallSceneType);    //创建任务信息
public:
	QString m_sTaskExecGuid;                //任务执行记录GUID
	QString m_sTaskGuid;					//归属任务的Guid
	QString m_sTaskName;                    //任务名称
	QString m_sTemplateGuid;                //模版GUID
	QString m_sGuid;                        //归属设备GUID
	int m_nExecState;                       //任务执行状态 0 未执行  1 已执行  2执行中  3任务中止 4.任务过期 
	int m_nItemCount;                       //巡检项数量
	int m_nExecItemCount;                   //已执行的巡检项数量
	int m_nAlarmItemCount;                  //报警的巡检项数量
	QString m_sStartTime;                   //开始时间
	QString m_sEndTime;                     //结束时间
	double m_dStartPower;                   //开始电量
	double m_dEndPower;                     //结束电量
	int m_nTaskType;						//任务类型 0:定时任务 1:周期任务 2:立即执行任务  3 信号触发任务A侧 4 信号触发任务B侧
	int m_nCollectAlarmCount;				//持续巡检项报警数量
	int m_nCollectExecCount;				//持续巡检项执行数量
	QVector<SCPolItemCom *>m_vecPolItemCom; //巡检项和结果数组对象
	double m_dPollSpeed;                    //巡检速度
	double m_dSpeedZ;				        //机器人Z轴速度
	QVector<int> m_vecTaskArray;            //PLC执行数组
	QVector<int> m_vecTaskIndex;            //PLC执行数组 持续巡检项的序号
	QMap<int,int>m_mapCorrIndex;            //序号对应关系   int 发给plc的序号   int 在m_vecPolItemCom里面的序号
	QString m_sTaskBreakReason;				//任务执行失败原因描述
	QString m_sTaskExecDes;					//任务执行结果描述
	QString m_sPdfPath;						//pdf保存路径（本地）
	QString m_sPdfPathUrl;					//pdfURL路径
	QString m_sSynthPdfPath;			    //综合pdf保存路径（本地）
	QString m_sSynthPdfPathUrl;				//综合pdfURL路径
	bool m_bIsShow;							//是否已经在界面中显示
	int  m_nBelong;							//此次任务归属皮带(0：A 1：B)
	QMap<QString, QString>m_mapCorreId;  //巡检项Guid
private:
	//QMap<int, QMap<int, SCPolItemCom*>>m_mapPolItemCom;//QMap<巡检点离原点距离,QMap<巡检项在改巡检点下的序号, SCPolItemCom*>>
	QMap<int, QMap<int, SCPolItemCom*>>m_mapPolItemCom;   //int 序号  不用巡检点位置排序了
 private:
	SCPolItemCom *createPolItemCom(CPolItem *pPolItem, CPolPoint *pPolPoint); //创建SCPolItemCom对象
	void createTaskArray();
	void resetData();   //复位数据
};

#endif